<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Chamilo Optimization Guide</title><link rel="stylesheet" href="default.css" type="text/css" media="screen,projection" />
	<link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
	<style type="text/css">
	<!--
		page { width: 21cm; height: 29.7cm; margin: 2cm }
		pre { font-family: "Courier New", monospace }
		p { margin-bottom: 0.21cm }
		.code {margin: 1em 1em 1em 2em; padding: 0.5em; background-color: rgb(229, 229, 229); vertical-align: top; border: 1px solid #999999;}
	-->
	</style>
	</head>
<body>

<div id="header1">
	<h1>Chamilo 1.8.8.4 : Optimization Guide</h1>
</div>

<a href="index.html">Documentation</a> &gt; Optimization Guide
<div id="outerframe">
<div id="main">

<p>In seldom cases, you will need to start looking into efficiency issues with Chamilo. This guide is a work in progress intended to help administrators optimize their Chamilo installation.</p>


<h2><b>Contents</b></h2>

<ol>

  <li><a href="#1.Using-XCache">Using xCache</a></li>
  <li><a href="#2.Slow-queries">Slow queries</a></li>
  <li><a href="#3.Indexes-caching">Indexes caching</a></li>
  <li><a href="#4.Sessions-directories">Sessions directories</a></li>
  <li><a href="#5.Users-upload-directories">Users upload directories</a></li>
  <li><a href="#6.Zlib-compression">Zlib compressed output</a></li>
</ol>

<h2><a name="1.Using-XCache"></a>1. Using xCache</h2>
See <a href="http://xcache.lighttpd.net/">xCache's website</a> for summary documentation.<br />
<ul>
<li>On Debian/Ubuntu: sudo apt-get install php5-xcache</li>
</ul>
Set your xcache.ini configuration (/etc/php5/conf.d/xcache.ini) to match your system. For example, you *could* have something like this (intentionally hiding comments here):
<pre>
xcache.shm_scheme =        "mmap"
xcache.size  =                32M
xcache.count =                 2
xcache.slots =                8K
xcache.ttl   =                 0
xcache.gc_interval =           0
xcache.var_size  =           16M
xcache.var_count =            16
xcache.var_slots =            8K
xcache.var_ttl   =            60
xcache.var_maxttl   =        300
xcache.var_gc_interval =     300
xcache.test =                Off
</pre>
xCache will feel useless until you actually start to put some variables in cache. If you're showing the "Who is online" counter, that's one of the best item there is to implement xCache.<br />
For example, you could implement it this way (in main/inc/banner.inc.php):<br />
<pre>
$xc = function_exists('xcache_isset');
$number = 0;
if ($xc &amp;&amp; xcache_isset('campus_chamilo_org_whoisonline_count_simple')) {
  $number = xcache_get('campus_chamilo_org_whoisonline_count_simple');
} else {
  $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
  xcache_set('campus_chamilo_org_whoisonline_count_simple',$number);
}
$number_online_in_course = 0;
if(!empty($_course['id'])) {
  if ($xc &amp;&amp; xcache_isset('campus_chamilo_org_whoisonline_count_simple_'.$_course['id'])) {
    $number_online_in_course = xcache_get('campus_chamilo_org_whoisonline_count_simple_'.$_course['id']);
  } else {
    $number_online_in_course = who_is_online_in_this_course_count(api_get_user_id(), api_get_setting('time_limit_whosonline'), $_course['id']);
    xcache_set('campus_chamilo_org_whoisonline_count_simple_'.$_course['id'],$number_online_in_course);
  }
}
</pre>
Note that, as xCache is a shared caching system, it is very important to prefix your variables with a domain name or some kind of identifier, otherwise it would end up in disaster if you use a shared server for several portals.<br />
<br />
An optional additional caching mechanism you may use is the realpath_cache_size and realpath_cache_ttl php.ini parameters. See <a href="http://php.net/manual/en/ini.core.php">the PHP documentation</a> for more details.
<hr />
<h2><a name="2.Slow-queries"></a>2. Slow queries</h2>
Enable slow_queries in /etc/mysqld/my.cnf, restart MySQL then follow using sudo tail -f /var/log/mysql/mysql-slow.log
<hr />
<h2><a name="3.Indexes-caching"></a>3. Indexes caching</h2>
One good reference: <a href="http://dev.mysql.com/doc/refman/5.1/en/multiple-key-caches.html">MySQL documentation on multiple key caches</a><br />

<hr />

<h2><a name="4.Sessions-directories"></a>4. Sessions directories</h2>
php_admin_value session.save_path 1;/var/www/test.chamilo.org/sessions/
<hr />
<h2><a name="5.Users-upload-directories"></a>5. Users upload directories</h2>
Create 10 directories inside the main/upload/users directory (from 0 to 9) and update your admin settings. This has to be done at install &amp; configuration time, otherwise you might loose user data (or have to write a script for data distribution).
<hr />
<h2><a name="6.Zlib-compression"></a>6. Zlib compressed output</h2>
Although this will not make your server faster, compressing the pages you are sending to the users will definitely make them feel like your website's responses are a lot faster, and thus increase their well-being when using Chamilo.<br /><br />
Zlib output compression has to be set at two levels: PHP configuration for PHP pages and Apache for images and CSS.<br /><br />
To update the PHP configuration (either in php.ini or in your VirtualHost), use the <a href="http://php.net/manual/en/zlib.configuration.php">zlib.output_compression</a>. If you set this inside your Apache's VirtualHost, you should use the following syntax.
<pre>
php_value zlib.output_compression 1
</pre>
<br />
Configuring your Apache server to use output compression is a bit trickier. You have to use <a href="http://php.net/manual/en/zlib.configuration.php">the mod_deflate module</a> to do it. Your configuration should look like something like this (please read the corresponding documentation before implementing in production).<br />
Easy mode:
<pre>
AddOutputFilterByType DEFLATE text/html text/plain text/xml
</pre> or, for every content type (dangerous) you can put the following inside a location or directory block:<pre>SetOutputFilter DEFLATE</pre>
<br />
Advanced mode:
<pre>
<Location />
# Insert filter
SetOutputFilter DEFLATE

# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location> 
</pre>
<hr />
Don't have time or resources to optimize your Chamilo installation yourself? Hire an <a href="http://www.chamilo.org/en/providers">official Chamilo provider</a> and get it sorted out professionally by specialists.
    <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10-blue" alt="Valid XHTML 1.0 Transitional" style="margin: 1em; float: right;" height="31" width="88" /></a>
	<a href="http://jigsaw.w3.org/css-validator/">
		<img src="http://jigsaw.w3.org/css-validator/images/vcss-blue" style="margin: 1em; float: right;" alt="Valid CSS" />
	</a>
<hr />
<h2>Authors</h2>
<ul>
<li>Yannick Warnier, Zend Certified PHP Engineer, BeezNest Belgium SPRL, <a href="mailto:ywarnier@beeznest.net">ywarnier@beeznest.net</a></li>
</ul>
</body></html>
